一般 SoC 引导方式

  • 润物细无声
  • 2024-04-07 13:30

    SoC 启动流程

    BootROM

    通常来说,SoC 厂家都会做一个 ROM 在 SoC 的内部,这个 ROM 很小,里面固化了上电启动的代码(一经固化,永不能改,是芯片做的时候,做进去的);这部分代码叫做 BootROM。

    芯片上电后先接管系统的是 SoC 厂家的 BootROM,它要做些什么事情呢:

    BootRom 加载程序到 SRAM

    系统上电启动的时候,会将烧写到外部存储设备上(eMMC、Nand、SD 等)的程序读到内存中执行。

    上电后先接管系统的是 SoC 厂家的 BootROM,其它可执行的程序(u-boot、Kernel)都放到(烧写)了外部存储器上的。那么 BootROM 的代码除了去初始化硬件环境以外,还需要去外部存储器上面将接下来可执行的程序读到内存来执行。

    一般来说,SoC 都会做一个内部的小容量的 SRAM。BootROM 将外部的可执行程序从外部存储器中读出来,放到 SRAM 去执行。既然是读到内存执行,那么这个内存可以不可以是我们板载的 DDR 呢?理论上是可以的,但 SoC 厂家设计的 DDR 控制器一般会支持很多种类型的 DDR 设备,并且会提供兼容性列表,SoC 厂家怎么可能知道用户PCB上到底用了哪种内存呢?

    选择从哪个外设读取启动程序

    那么 BootROM 从具体哪个存储器读出二进制文件呢?SoC 厂家一般会支持多种启动方式,比如从 eMMC 读取,从 SDCard 读取,从 Nand Flash 读取等等。所以上电的时候,需要告诉它,它需要从什么样的外设来读取后面的启动二进制文件。

    一般的设计思路是:做一组 Bootstrap Pin,上电的时候 BootROM 去采集这几个 IO 的电平来确认要从什么外部存储器来加载后续的可执行文件。比如 2 个 IO,00 表示从 Nand 启动,01 表示从 eMMC 启动, 10 表示从 SDCard 启动等等。

    当 BootROM 读到这些值后,就会去初始化对应的外设,然后读取后面要执行的代码。这些 IO 一般来说,会做成板载的拨码开关,用于调整芯片的启动方式。

    这里,读取烧写的二进制的时候需要注意一些细节:比如 SoC 厂家告诉你,你需要先把 SDCard 初始化称为某种文件系统,然后把东西放进去才有效之类的。因为文件系统是组织文件的方式,并不是裸分区。你按照 A 文件系统的方式放进去,然后 SoC 的 BootROM 也按照 A 文件系统的方式读出来,才能够达成一致。

    如果你对 Mini2440 这款开发板足够了解的话,应该知道其采用的 SoC 型号为 s3c2440,其内部有一个 4kb 的 SRAM。其有两种启动方式:

    1. 采用 Nor Flash 启动,0x00000000 就是 2MB Nor Flash 实际的起始地址,由于 uboot 程序一般只有几百 kb,可以全部烧录到 Nor Flash 中,因此uboot 程序完全可以在 Nor Flash 中运行,没有拷贝到 SDRAM 中运行的必要。
    2. 采用 Nand Flash 启动,片内 4kb 的 SRAM 被映射到了 0x00000000,s3c2440 的 BootROM 会自动把 Nand Flash 中的前 4kb 代码数据搬到内部 SRAM 中运行。

    那么问题来了,假设 4kb 代码运行到最后,我想继续运行 Nand Flash 剩余的代码怎么办?为了解决这个问题,uboot 引入了 SPL,全称 Secondary Program Loader。

    注意:无论是 Nor Flash 还是 Nand Flash 都是外挂在 s3c2440 上的的存储设备。

    X86 启动方式

    我记得应该是 BIOS 读取硬盘第一个扇区到固定地址,这个扇区前面是一段启动程序,后面是分区表和55AA校验码。由这个段程序,通过 BIOS 加载后面代码启动。

    对于 LILO, Grub 之类的引导程序,则会霸占这个地方用作第一段启动程序。

    总结

    不管如何,CPU 总是从内存中读取代码运行的,而内存是通过地址线连接符合读码译码规范(直接读取,不存在什么状态位,同步控制之类的)的存储介质,可能是 SRAM,ROM,FLASH 之类的,挂载映射到内存空间中的存储介质。而 CPU 的 kick up 总是从固有的地址的程序开始执行,这段程序将负责引导工作,将后续程序加载到内存中,做一些初始化(不一定是它做,可能是它加载的程序在做),比如 DDR 的初始化。最后经过一些跳转,执行最终的程序。

    符合读码译码规范的存储介质是什么样的呢?大概就是在一定的时钟周期,不需要额外信号能将地址线信号转换成数据线信号。只要某个存储介质能做到,与 CPU 直接接通后,CPU 便可执行存放在介质中的程序(而不能被 CPU 访问执行程序的存储介质,可通过一定的执行流程以读写数据的形式访问)。这一点,arm m3 中的 FSMC 便能做到灵活映射内存地址空间,将 FLASH 映射给 CPU 用于执行程序。

    至于 CPU 从固有地址 kick up 则可以通过一些 IO 信号重映射,映射到其他地址(即内存其他地址的程序起始地址)。此时很多设备,包括 DDR 都没有初始化,所以被映射的存储介质应该一通电便能被 CPU 直接访问执行指令(BootROM 便是如此)。

    参考

    1. Rockchip RK3399 - 引导流程和准备工作
    2. Rockchip RK3568 TRM Part1 V1.1-20210301.pdf
    3. 正点原子战舰 v4 启动引导(ARMv7-m3)

    © 2022-2024 留校察看 liuxocakn 保留所有权利 All Rights Reserved
    蜀ICP证2022022862号-1 川公网安备51010702003077号

    自 2024-04-23 22:54 之后访问量: 66156